Contents
These plots are inspired by GATK recommendations on hard filtering Please check the page and refer to it for further info and assistance.
Raw values from HaplotypeCaller
These plot show the distribution of quality control scores among the variants called by HaplotypeCaller. This caller is optimized to achieve maximum sensitivity and the results will include false positives. We will use these plots to apply two types hard filters on the data. For each of the 6 paramters we set 2 types of hard cutoffs:
lenient: to include as many true positives as possible. It will still include some false positives but it shouldn’t exclude true positives. This set should be used for data filtering (e.g. WASP) and when we need to be conservative and cautious about variant call. Cutoff lines on plots are in GREEN.
strict: to remove as many false positives as possible. We put harsh hard filters o our 6 parameters to exclude false positives. We end up with an high confidence variant callset. We do this at the cost of rejecting some true positive as well. This can set should be used when high confidence is key for the analysis (e.g. assigning reads to maternal/paternal allele). Cutoff lines on plots are in RED.
Mapping Quality
This is the root mean square mapping quality over all the reads at the site. Instead of the average mapping quality of the site, this annotation gives the square root of the average of the squares of the mapping qualities at the site. It is meant to include the standard deviation of the mapping qualities. Including the standard deviation allows us to include the variation in the dataset. A low standard deviation means the values are all close to the mean, whereas a high standard deviation means the values are all far from the mean.When the mapping qualities are good at a site, the MQ will be around 60.
SNP

INDEL

Mapping Quality Rank Sum Test
This is the u-based z-approximation from the Rank Sum Test for mapping qualities. It compares the mapping qualities of the reads supporting the reference allele and the alternate allele. A positive value means the mapping qualities of the reads supporting the alternate allele are higher than those supporting the reference allele; a negative value indicates the mapping qualities of the reference allele are higher than those supporting the alternate allele. A value close to zero is best and indicates little difference between the mapping qualities.
SNP

INDEL

Quality by Depth
This is the variant confidence (from the QUAL field) divided by the unfiltered depth of non-hom-ref samples. This annotation is intended to normalize the variant quality in order to avoid inflation caused when there is deep coverage. For filtering purposes it is better to use QD than either QUAL or DP directly.
SNP

INDEL

Strand Odds Ratio
This is another way to estimate strand bias using a test similar to the symmetric odds ratio test. SOR was created because FS tends to penalize variants that occur at the ends of exons. Reads at the ends of exons tend to only be covered by reads in one direction and FS gives those variants a bad score. SOR will take into account the ratios of reads that cover both alleles.
SNP

INDEL

FisherTest Strand
This is the Phred-scaled probability that there is strand bias at the site. Strand Bias tells us whether the alternate allele was seen more or less often on the forward or reverse strand than the reference allele. When there little to no strand bias at the site, the FS value will be close to 0.
SNP
Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 623071 rows containing non-finite values (stat_density).

INDEL
Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 163094 rows containing non-finite values (stat_density).

Read Position Rank Sum Test
This is the u-based z-approximation from the Rank Sum Test for site position within reads. It compares whether the positions of the reference and alternate alleles are different within the reads. Seeing an allele only near the ends of reads is indicative of error, because that is where sequencers tend to make the most errors. A negative value indicates that the alternate allele is found at the ends of reads more often than the reference allele; a positive value indicates that the reference allele is found at the ends of reads more often than the alternate allele. A value close to zero is best because it indicates there is little difference between the positions of the reference and alternate alleles in the reads.
SNP

INDEL

Post filtering comparisons
Mapping Quality
SNP
The total number of variants filtered by MQ for SNP:

INDEL
The total number of variants filtered by MQ for INDEL:

Mapping Quality Rank Sum Test
SNP
The total number of variants filtered by MQRST for SNP:

INDEL
The total number of variants filtered by MQRST for INDEL:

Quality by Depth
SNP
The total number of variants filtered by QD for SNP:

INDEL
The total number of variants filtered by QD for SNP:

Strand Odds Ratio
SNP
The total number of variants filtered by SOR for SNP:

INDEL
The total number of variants filtered by SOR for INDEL:

FisherTest Strand
SNP
The total number of variants filtered by FS for SNP:
Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 1667727 rows containing non-finite values (stat_density).

INDEL
The total number of variants filtered by FS for SNP:
Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 405841 rows containing non-finite values (stat_density).

Read Position Rank Sum Test
SNP
The total number of variants filtered by RST for SNP:

INDEL
The total number of variants filtered by RST for SNP:

LS0tCnRpdGxlOiAiR0FUSyBxdWFsaXR5IGNvbnRyb2wiCm91dHB1dDoKICAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgICB0b2M6IHRydWUKICAgICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgaGlnaGxpZ2h0OiB0YW5nbwojYmlibGlvZ3JhcGh5OiBrbm5fbWxfaW50cm8uYmliCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCmBgYHtyIHN0eWxlLCBlY2hvPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KbGlicmFyeSgia25pdHIiKQpvcHRpb25zKGRpZ2l0cyA9IDIsIHdpZHRoID0gODApCm9wdGlvbnMoYml0bWFwVHlwZSA9ICdjYWlybycpCmdvbGRlbl9yYXRpbyA8LSAoMSArIHNxcnQoNSkpIC8gMgpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeSA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSwgY2FjaGUubGF6eSA9IEZBTFNFLAogICAgICAgICAgICAgICBkZXY9YygncG5nJywgJ3BkZicsICdzdmcnKSwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDQgKiBnb2xkZW5fcmF0aW8sIGNvbW1lbnQgPSAnICAnLCBkcGkgPSAzMDApCmBgYAoKYGBge3Igc2V0dXAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ci5saWJQYXRocyggYyggLmxpYlBhdGhzKCksICIvZy9mdXJsb25nL2Zvcm5lcmlzL3NvZnR3YXJlL1IvIikpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImltYWdlcy8iKQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSkKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKCmBgYHtyIGlucHV0LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9TTlBfRjEudHh0IikpCk1RX0lOREVMIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X01RX0lOREVMX0YxLnR4dCIpKQoKTVFSU1RfU05QIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX1NOUF9GMS50eHQiKSkKTVFSU1RfSU5ERUwgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJNYXBwaW5nX1F1YWxpdHlfUmFua19TdW1fSU5ERUxfRjEudHh0IikpCgpRRF9TTlAgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX1NOUF9GMS50eHQiKSkKUURfSU5ERUwgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX0lOREVMX0YxLnR4dCIpKQoKU09SX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlN0cmFuZF9PZGRzX1JhdGlvX1NPUl9TTlBfRjEudHh0IikpClNPUl9JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlN0cmFuZF9PZGRzX1JhdGlvX1NPUl9JTkRFTF9GMS50eHQiKSkKCkZTX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfU05QX0YxLnR4dCIpKQpGU19JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfSU5ERUxfRjEudHh0IikpCgpSU1RfU05QIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUmFua19TdW1fVGVzdF9TTlBfRjEudHh0IikpClJTVF9JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfSU5ERUxfRjEudHh0IikpCmBgYAoKClRoZXNlIHBsb3RzIGFyZSBpbnNwaXJlZCBieSBbR0FUSyByZWNvbW1lbmRhdGlvbnMgb24gaGFyZCBmaWx0ZXJpbmddKGh0dHBzOi8vc29mdHdhcmUuYnJvYWRpbnN0aXR1dGUub3JnL2dhdGsvZG9jdW1lbnRhdGlvbi9hcnRpY2xlLnBocD9pZD02OTI1KQpQbGVhc2UgY2hlY2sgdGhlIHBhZ2UgYW5kIHJlZmVyIHRvIGl0IGZvciBmdXJ0aGVyIGluZm8gYW5kIGFzc2lzdGFuY2UuCgojIFJhdyB2YWx1ZXMgZnJvbSBIYXBsb3R5cGVDYWxsZXIKClRoZXNlIHBsb3Qgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIHF1YWxpdHkgY29udHJvbCBzY29yZXMgYW1vbmcgdGhlIHZhcmlhbnRzIGNhbGxlZCBieSBIYXBsb3R5cGVDYWxsZXIuIFRoaXMgY2FsbGVyIGlzIG9wdGltaXplZCB0byBhY2hpZXZlIG1heGltdW0gc2Vuc2l0aXZpdHkgYW5kIHRoZSByZXN1bHRzIHdpbGwgaW5jbHVkZSBmYWxzZSBwb3NpdGl2ZXMuIFdlIHdpbGwgdXNlIHRoZXNlIHBsb3RzIHRvIGFwcGx5IHR3byB0eXBlcyBoYXJkIGZpbHRlcnMgb24gdGhlIGRhdGEuIEZvciBlYWNoIG9mIHRoZSA2IHBhcmFtdGVycyB3ZSBzZXQgMiB0eXBlcyBvZiBoYXJkIGN1dG9mZnM6CgoqIGxlbmllbnQ6IHRvIGluY2x1ZGUgYXMgbWFueSB0cnVlIHBvc2l0aXZlcyBhcyBwb3NzaWJsZS4gSXQgd2lsbCBzdGlsbCBpbmNsdWRlIHNvbWUgZmFsc2UgcG9zaXRpdmVzIGJ1dCBpdCBzaG91bGRuJ3QgZXhjbHVkZSB0cnVlIHBvc2l0aXZlcy4gVGhpcyBzZXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRhdGEgZmlsdGVyaW5nIChlLmcuIFdBU1ApIGFuZCB3aGVuIHdlIG5lZWQgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBjYXV0aW91cyBhYm91dCB2YXJpYW50IGNhbGwuIEN1dG9mZiBsaW5lcyBvbiBwbG90cyBhcmUgaW4gR1JFRU4uCgoqIHN0cmljdDogdG8gcmVtb3ZlIGFzIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGFzIHBvc3NpYmxlLiBXZSBwdXQgaGFyc2ggaGFyZCBmaWx0ZXJzIG8gb3VyIDYgcGFyYW1ldGVycyB0byBleGNsdWRlIGZhbHNlIHBvc2l0aXZlcy4gV2UgZW5kIHVwIHdpdGggYW4gaGlnaCBjb25maWRlbmNlIHZhcmlhbnQgY2FsbHNldC4gV2UgZG8gdGhpcyBhdCB0aGUgY29zdCBvZiByZWplY3Rpbmcgc29tZSB0cnVlIHBvc2l0aXZlIGFzIHdlbGwuIFRoaXMgY2FuIHNldCBzaG91bGQgYmUgdXNlZCB3aGVuIGhpZ2ggY29uZmlkZW5jZSBpcyBrZXkgZm9yIHRoZSBhbmFseXNpcyAoZS5nLiBhc3NpZ25pbmcgcmVhZHMgdG8gbWF0ZXJuYWwvcGF0ZXJuYWwgYWxsZWxlKS4gQ3V0b2ZmIGxpbmVzIG9uIHBsb3RzIGFyZSBpbiBSRUQuCgojIyBNYXBwaW5nIFF1YWxpdHkKClRoaXMgaXMgdGhlIHJvb3QgbWVhbiBzcXVhcmUgbWFwcGluZyBxdWFsaXR5IG92ZXIgYWxsIHRoZSByZWFkcyBhdCB0aGUgc2l0ZS4gSW5zdGVhZCBvZiB0aGUgYXZlcmFnZSBtYXBwaW5nIHF1YWxpdHkgb2YgdGhlIHNpdGUsIHRoaXMgYW5ub3RhdGlvbiBnaXZlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNxdWFyZXMgb2YgdGhlIG1hcHBpbmcgcXVhbGl0aWVzIGF0IHRoZSBzaXRlLiBJdCBpcyBtZWFudCB0byBpbmNsdWRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1hcHBpbmcgcXVhbGl0aWVzLiBJbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBhbGxvd3MgdXMgdG8gaW5jbHVkZSB0aGUgdmFyaWF0aW9uIGluIHRoZSBkYXRhc2V0LiBBIGxvdyBzdGFuZGFyZCBkZXZpYXRpb24gbWVhbnMgdGhlIHZhbHVlcyBhcmUgYWxsIGNsb3NlIHRvIHRoZSBtZWFuLCB3aGVyZWFzIGEgaGlnaCBzdGFuZGFyZCBkZXZpYXRpb24gbWVhbnMgdGhlIHZhbHVlcyBhcmUgYWxsIGZhciBmcm9tIHRoZSBtZWFuLldoZW4gdGhlIG1hcHBpbmcgcXVhbGl0aWVzIGFyZSBnb29kIGF0IGEgc2l0ZSwgdGhlIE1RIHdpbGwgYmUgYXJvdW5kIDYwLgoKIyMjIFNOUAoKYGBge3IgTVFfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIHF1YWxpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDU4LCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpgYGB7ciBNUV9JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KE1RX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIFF1YWxpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDU4LCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMgTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QKClRoaXMgaXMgdGhlIHUtYmFzZWQgei1hcHByb3hpbWF0aW9uIGZyb20gdGhlIFJhbmsgU3VtIFRlc3QgZm9yIG1hcHBpbmcgcXVhbGl0aWVzLiBJdCBjb21wYXJlcyB0aGUgbWFwcGluZyBxdWFsaXRpZXMgb2YgdGhlIHJlYWRzIHN1cHBvcnRpbmcgdGhlIHJlZmVyZW5jZSBhbGxlbGUgYW5kIHRoZSBhbHRlcm5hdGUgYWxsZWxlLiBBIHBvc2l0aXZlIHZhbHVlIG1lYW5zIHRoZSBtYXBwaW5nIHF1YWxpdGllcyBvZiB0aGUgcmVhZHMgc3VwcG9ydGluZyB0aGUgYWx0ZXJuYXRlIGFsbGVsZSBhcmUgaGlnaGVyIHRoYW4gdGhvc2Ugc3VwcG9ydGluZyB0aGUgcmVmZXJlbmNlIGFsbGVsZTsgYSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgcXVhbGl0aWVzIG9mIHRoZSByZWZlcmVuY2UgYWxsZWxlIGFyZSBoaWdoZXIgdGhhbiB0aG9zZSBzdXBwb3J0aW5nIHRoZSBhbHRlcm5hdGUgYWxsZWxlLiBBIHZhbHVlIGNsb3NlIHRvIHplcm8gaXMgYmVzdCBhbmQgaW5kaWNhdGVzIGxpdHRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1hcHBpbmcgcXVhbGl0aWVzLgoKIyMjIFNOUAoKYGBge3IgTVFSU1RfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFSU1RfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIFF1YWxpdHkgUmFuayBTdW0gVGVzdCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0xMi41LCAxMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMi41LDIuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKCmBgYHtyIE1RUlNUX0lOREVMLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFSU1RfSU5ERUwsIGFlcyhWNSkpICsgCiAgZ2VvbV9kZW5zaXR5KGNvbG91cj0icm95YWxibHVlMiIsIGZpbGw9InJveWFsYmx1ZTIiLCBhbHBoYT0wLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIk1hcHBpbmcgUXVhbGl0eSBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTEyLjUsIDEyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0yLjUsMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCgojIyBRdWFsaXR5IGJ5IERlcHRoCgpUaGlzIGlzIHRoZSB2YXJpYW50IGNvbmZpZGVuY2UgKGZyb20gdGhlIFFVQUwgZmllbGQpIGRpdmlkZWQgYnkgdGhlIHVuZmlsdGVyZWQgZGVwdGggb2Ygbm9uLWhvbS1yZWYgc2FtcGxlcy4gVGhpcyBhbm5vdGF0aW9uIGlzIGludGVuZGVkIHRvIG5vcm1hbGl6ZSB0aGUgdmFyaWFudCBxdWFsaXR5IGluIG9yZGVyIHRvIGF2b2lkIGluZmxhdGlvbiBjYXVzZWQgd2hlbiB0aGVyZSBpcyBkZWVwIGNvdmVyYWdlLiBGb3IgZmlsdGVyaW5nIHB1cnBvc2VzIGl0IGlzIGJldHRlciB0byB1c2UgUUQgdGhhbiBlaXRoZXIgUVVBTCBvciBEUCBkaXJlY3RseS4KCiMjIyBTTlAKCmBgYHtyIFFEX1NOUCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KFFEX1NOUCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUXVhbGl0eSBCeSBEZXB0aCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKYGBge3IgUURfSU5ERUwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChRRF9JTkRFTCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUXVhbGl0eSBCeSBEZXB0aCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFN0cmFuZCBPZGRzIFJhdGlvCgpUaGlzIGlzIGFub3RoZXIgd2F5IHRvIGVzdGltYXRlIHN0cmFuZCBiaWFzIHVzaW5nIGEgdGVzdCBzaW1pbGFyIHRvIHRoZSBzeW1tZXRyaWMgb2RkcyByYXRpbyB0ZXN0LiBTT1Igd2FzIGNyZWF0ZWQgYmVjYXVzZSBGUyB0ZW5kcyB0byBwZW5hbGl6ZSB2YXJpYW50cyB0aGF0IG9jY3VyIGF0IHRoZSBlbmRzIG9mIGV4b25zLiBSZWFkcyBhdCB0aGUgZW5kcyBvZiBleG9ucyB0ZW5kIHRvIG9ubHkgYmUgY292ZXJlZCBieSByZWFkcyBpbiBvbmUgZGlyZWN0aW9uIGFuZCBGUyBnaXZlcyB0aG9zZSB2YXJpYW50cyBhIGJhZCBzY29yZS4gU09SIHdpbGwgdGFrZSBpbnRvIGFjY291bnQgdGhlIHJhdGlvcyBvZiByZWFkcyB0aGF0IGNvdmVyIGJvdGggYWxsZWxlcy4KCiMjIyBTTlAKCmBgYHtyIFNPUl9TTlAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChTT1JfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJTdHJhbmQgT2RkcyBSYXRpbyIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDMpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKCmBgYHtyIFNPUl9JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KFNPUl9JTkRFTCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiU3RyYW5kIE9kZHMgUmF0aW8iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygzKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgojIyBGaXNoZXJUZXN0IFN0cmFuZAoKVGhpcyBpcyB0aGUgUGhyZWQtc2NhbGVkIHByb2JhYmlsaXR5IHRoYXQgdGhlcmUgaXMgc3RyYW5kIGJpYXMgYXQgdGhlIHNpdGUuIFN0cmFuZCBCaWFzIHRlbGxzIHVzIHdoZXRoZXIgdGhlIGFsdGVybmF0ZSBhbGxlbGUgd2FzIHNlZW4gbW9yZSBvciBsZXNzIG9mdGVuIG9uIHRoZSBmb3J3YXJkIG9yIHJldmVyc2Ugc3RyYW5kIHRoYW4gdGhlIHJlZmVyZW5jZSBhbGxlbGUuIFdoZW4gdGhlcmUgbGl0dGxlIHRvIG5vIHN0cmFuZCBiaWFzIGF0IHRoZSBzaXRlLCB0aGUgRlMgdmFsdWUgd2lsbCBiZSBjbG9zZSB0byAwLgoKIyMjIFNOUAoKYGBge3IgRlNfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoRlNfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiRmlzaGVyVGVzdCBTdHJhbmQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyg2MCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMTApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpgYGB7ciBGU19JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KEZTX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIkZpc2hlclRlc3QgU3RyYW5kIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoNjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdAoKVGhpcyBpcyB0aGUgdS1iYXNlZCB6LWFwcHJveGltYXRpb24gZnJvbSB0aGUgUmFuayBTdW0gVGVzdCBmb3Igc2l0ZSBwb3NpdGlvbiB3aXRoaW4gcmVhZHMuIEl0IGNvbXBhcmVzIHdoZXRoZXIgdGhlIHBvc2l0aW9ucyBvZiB0aGUgcmVmZXJlbmNlIGFuZCBhbHRlcm5hdGUgYWxsZWxlcyBhcmUgZGlmZmVyZW50IHdpdGhpbiB0aGUgcmVhZHMuIFNlZWluZyBhbiBhbGxlbGUgb25seSBuZWFyIHRoZSBlbmRzIG9mIHJlYWRzIGlzIGluZGljYXRpdmUgb2YgZXJyb3IsIGJlY2F1c2UgdGhhdCBpcyB3aGVyZSBzZXF1ZW5jZXJzIHRlbmQgdG8gbWFrZSB0aGUgbW9zdCBlcnJvcnMuIEEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGFsdGVybmF0ZSBhbGxlbGUgaXMgZm91bmQgYXQgdGhlIGVuZHMgb2YgcmVhZHMgbW9yZSBvZnRlbiB0aGFuIHRoZSByZWZlcmVuY2UgYWxsZWxlOyBhIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSByZWZlcmVuY2UgYWxsZWxlIGlzIGZvdW5kIGF0IHRoZSBlbmRzIG9mIHJlYWRzIG1vcmUgb2Z0ZW4gdGhhbiB0aGUgYWx0ZXJuYXRlIGFsbGVsZS4gQSB2YWx1ZSBjbG9zZSB0byB6ZXJvIGlzIGJlc3QgYmVjYXVzZSBpdCBpbmRpY2F0ZXMgdGhlcmUgaXMgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9zaXRpb25zIG9mIHRoZSByZWZlcmVuY2UgYW5kIGFsdGVybmF0ZSBhbGxlbGVzIGluIHRoZSByZWFkcy4KCiMjIyBTTlAKCmBgYHtyIFJTVF9TTlAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChSU1RfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJSZWFkIFBvc2l0aW9uIFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtOCw4KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtNCw0KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKYGBge3IgUlNUX0lOREVMLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoUlNUX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJSZWFkIFBvc2l0aW9uIFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtOCw4KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtNCw0KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMgUG9zdCBmaWx0ZXJpbmcgY29tcGFyaXNvbnMKCgpgYGB7ciBpbnB1dF9sZW5pZW50LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X01RX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKTVFfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKCk1RUlNUX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKTVFSU1RfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9SYW5rX1N1bV9JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKClFEX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9TTlBfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpClFEX0lOREVMX2xlbmllbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX0lOREVMX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQoKU09SX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiU3RyYW5kX09kZHNfUmF0aW9fU09SX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKU09SX0lOREVMX2xlbmllbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfSU5ERUxfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpCgpGU19TTlBfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfU05QX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQpGU19JTkRFTF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiRmlzaGVyX1N0cmFuZF9GU19JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKClJTVF9TTlBfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfU05QX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQpSU1RfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfSU5ERUxfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpCmBgYAoKYGBge3IgaW5wdXRfc3RyaW5nZW50LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJNYXBwaW5nX1F1YWxpdHlfTVFfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCk1RX0lOREVMX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9JTkRFTF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQoKTVFSU1RfU05QX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9SYW5rX1N1bV9TTlBfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKTVFSU1RfSU5ERUxfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCgpRRF9TTlBfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9TTlBfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKUURfSU5ERUxfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9JTkRFTF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQoKU09SX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpClNPUl9JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfSU5ERUxfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKCkZTX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJGaXNoZXJfU3RyYW5kX0ZTX1NOUF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQpGU19JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJGaXNoZXJfU3RyYW5kX0ZTX0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCgpSU1RfU05QX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpClJTVF9JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJSYW5rX1N1bV9UZXN0X0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCmBgYAoKCgojIyBNYXBwaW5nIFF1YWxpdHkKCmBgYHtyIE1RX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUV9TTlAsIFY1ID4gNDApCk1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX1NOUCwgVjUgPiA1OCkKYGBgCgoKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgTVEgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhNUV9TTlApIC0gbnJvdyhNUV9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coTVFfU05QKSAtIG5yb3coTVFfU05QX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coTVFfU05QKSoxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KE1RX1NOUCkgLSBucm93KE1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RX1NOUCkgLSBucm93KE1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coTVFfU05QKSoxMDBgJQogIAogIApgYGB7ciBNUV9JTkRFTF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX0lOREVMX2xlbmllbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX0lOREVMLCBWNSA+IDQwKQpNUV9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX0lOREVMLCBWNSA+IDU4KQpgYGAKCmBgYHtyIE1RX1NOUF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX1NOUCR0eXBlIDwtICJyYXciCk1RX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCk1RX1NOUF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpNUV9TTlBfYWxsIDwtIHJiaW5kKE1RX1NOUCwgTVFfU05QX2xlbmllbnQsIE1RX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoTVFfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAKICAgdGhlbWVfYncoKSArIAogICB4bGFiKCJNYXBwaW5nIHF1YWxpdHkiKSArCiAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTgsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgTVEgZm9yIElOREVMOiAKCiAgKiBsZW5pZW50OiBgciBucm93KE1RX0lOREVMKSAtIG5yb3coTVFfSU5ERUxfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coTVFfSU5ERUwpIC0gbnJvdyhNUV9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RX0lOREVMKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coTVFfSU5ERUwpIC0gbnJvdyhNUV9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RX0lOREVMKSAtIG5yb3coTVFfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RX0lOREVMKSAqIDEwMGAlCgpgYGB7ciBNUV9JTkRFTF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX0lOREVMJHR5cGUgPC0gInJhdyIKTVFfSU5ERUxfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpNUV9JTkRFTF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpNUV9JTkRFTF9hbGwgPC0gcmJpbmQoTVFfSU5ERUwsIE1RX0lOREVMX2xlbmllbnQsIE1RX0lOREVMX3N0cmluZ2VudCkKCmdncGxvdChNUV9TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIAogICB0aGVtZV9idygpICsgCiAgIHhsYWIoIk1hcHBpbmcgcXVhbGl0eSIpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1OCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKIyMgTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QKCmBgYHtyIE1RUlNUX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9TTlAsIFY1ID4gLTEyLjUgJiBWNSA8IDEyLjUpCk1RUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RUlNUX1NOUCwgVjUgPiAtMi41ICYgVjUgPDIuNSkKYGBgCgoKICAKYGBge3IgTVFSU1RfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpNUVJTVF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9JTkRFTCwgVjUgPiAtMTIuNSAmIFY1IDwgMTIuNSkKTVFSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9JTkRFTCwgVjUgPiAtMi41ICYgVjUgPDIuNSkKYGBgCgoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBNUVJTVCBmb3IgU05QOiAKCiAgKiBsZW5pZW50OiBgciBucm93KE1RUlNUX1NOUCkgLSBucm93KE1RUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RUlNUX1NOUCkgKiAxMDBgJQogIAoKYGBge3IgTVFSU1RfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KTVFSU1RfU05QJHR5cGUgPC0gInJhdyIKTVFSU1RfU05QX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKTVFSU1RfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCk1RUlNUX1NOUF9hbGwgPC0gcmJpbmQoTVFSU1RfU05QLCBNUVJTVF9TTlBfbGVuaWVudCwgTVFSU1RfU05QX3N0cmluZ2VudCkKCmdncGxvdChNUVJTVF9TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMTIuNSwgMTIuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTIuNSwyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpUaGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhbnRzIGZpbHRlcmVkIGJ5IE1RUlNUIGZvciBJTkRFTDogCgogICogbGVuaWVudDogYHIgbnJvdyhNUVJTVF9JTkRFTCkgLSBucm93KE1RUlNUX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RUlNUX0lOREVMKSAtIG5yb3coTVFSU1RfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9JTkRFTCkgKiAxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KE1RUlNUX0lOREVMKSAtIG5yb3coTVFSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9JTkRFTCkgLSBucm93KE1RUlNUX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9JTkRFTCkgKiAxMDBgJQoKCmBgYHtyIE1RUlNUX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KTVFSU1RfSU5ERUwkdHlwZSA8LSAicmF3IgpNUVJTVF9JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCk1RUlNUX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCk1RUlNUX0lOREVMX2FsbCA8LSByYmluZChNUVJTVF9JTkRFTCwgTVFSU1RfSU5ERUxfbGVuaWVudCwgTVFSU1RfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KE1RUlNUX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIk1hcHBpbmcgUXVhbGl0eSBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTEyLjUsIDEyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0yLjUsMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFF1YWxpdHkgYnkgRGVwdGgKCmBgYHtyIFFEX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClFEX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChRRF9TTlAsIFY1ID4gMikKUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoUURfU05QLCBWNSA+IDIwKQpgYGAKICAKYGBge3IgUURfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpRRF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChRRF9JTkRFTCwgVjUgPiAyKQpRRF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFFEX0lOREVMLCBWNSA+IDIwKQpgYGAKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgUUQgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhRRF9TTlApIC0gbnJvdyhRRF9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfU05QKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhRRF9TTlApICogMTAwYCUKCmBgYHtyIFFEX1NOUF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClFEX1NOUCR0eXBlIDwtICJyYXciClFEX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClFEX1NOUF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpRRF9TTlBfYWxsIDwtIHJiaW5kKFFEX1NOUCwgUURfU05QX2xlbmllbnQsIFFEX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoUURfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKwogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJRdWFsaXR5IEJ5IERlcHRoIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMiksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpUaGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhbnRzIGZpbHRlcmVkIGJ5IFFEIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coUURfSU5ERUwpIC0gbnJvdyhRRF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhRRF9JTkRFTCkgLSBucm93KFFEX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhRRF9JTkRFTCkgLSBucm93KFFEX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfSU5ERUwpIC0gbnJvdyhRRF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfSU5ERUwpICogMTAwYCUKCmBgYHtyIFFEX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KUURfSU5ERUwkdHlwZSA8LSAicmF3IgpRRF9JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClFEX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClFEX0lOREVMX2FsbCA8LSByYmluZChRRF9JTkRFTCwgUURfSU5ERUxfbGVuaWVudCwgUURfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KFFEX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlF1YWxpdHkgQnkgRGVwdGgiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygyKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygyMCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyBTdHJhbmQgT2RkcyBSYXRpbwoKYGBge3IgU09SX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX1NOUCwgVjUgPCAzKQpTT1JfU05QX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX1NOUCwgVjUgPCAxLjUpCmBgYAogIApgYGB7ciBTT1JfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpTT1JfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX0lOREVMLCBWNSA8IDMpClNPUl9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFNPUl9JTkRFTCwgVjUgPCAxLjUpCmBgYAoKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgU09SIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhTT1JfU05QKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfU05QKSAtIG5yb3coU09SX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coU09SX1NOUCkgKiAxMDBgJQoKCmBgYHtyIFNPUl9TTlBfYWxsLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpTT1JfU05QJHR5cGUgPC0gInJhdyIKU09SX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClNPUl9TTlBfc3RyaW5nZW50JHR5cGUgPC0gInN0cmluZ2VudCIKU09SX1NOUF9hbGwgPC0gcmJpbmQoU09SX1NOUCwgU09SX1NOUF9sZW5pZW50LCBTT1JfU05QX3N0cmluZ2VudCkKCmdncGxvdChTT1JfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlN0cmFuZCBPZGRzIFJhdGlvIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMyksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMS41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBTT1IgZm9yIElOREVMOiAKCiAgKiBsZW5pZW50OiBgciBucm93KFNPUl9JTkRFTCkgLSBucm93KFNPUl9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhTT1JfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KFNPUl9JTkRFTCkgKiAxMDBgJQoKYGBge3IgU09SX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KU09SX0lOREVMJHR5cGUgPC0gInJhdyIKU09SX0lOREVMX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKU09SX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClNPUl9JTkRFTF9hbGwgPC0gcmJpbmQoU09SX0lOREVMLCBTT1JfSU5ERUxfbGVuaWVudCwgU09SX0lOREVMX3N0cmluZ2VudCkKCmdncGxvdChTT1JfSU5ERUxfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiU3RyYW5kIE9kZHMgUmF0aW8iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygzKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMgRmlzaGVyVGVzdCBTdHJhbmQKCmBgYHtyIEZTX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CkZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChGU19TTlAsIFY1IDwgNjApCkZTX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KEZTX1NOUCwgVjUgPCAxMCkKYGBgCiAgCmBgYHtyIEZTX0lOREVMX2ZpbHRlcmluZ19zdGF0cywgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoRlNfSU5ERUwsIFY1IDwgNjApCkZTX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoRlNfSU5ERUwsIFY1IDwgMTApCmBgYAoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBGUyBmb3IgU05QOiAKCiAgKiBsZW5pZW50OiBgciBucm93KEZTX1NOUCkgLSBucm93KEZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhGU19TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KEZTX1NOUCkgKiAxMDBgJQoKYGBge3IgRlNfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfU05QJHR5cGUgPC0gInJhdyIKRlNfU05QX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKRlNfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCkZTX1NOUF9hbGwgPC0gcmJpbmQoRlNfU05QLCBGU19TTlBfbGVuaWVudCwgRlNfU05QX3N0cmluZ2VudCkKCmdncGxvdChGU19TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZzEwJykgKwogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJGaXNoZXJUZXN0IFN0cmFuZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDYwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxMCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgRlMgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhGU19JTkRFTCkgLSBucm93KEZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19JTkRFTCkgLSBucm93KEZTX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coRlNfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhGU19JTkRFTCkgLSBucm93KEZTX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coRlNfSU5ERUwpIC0gbnJvdyhGU19JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coRlNfSU5ERUwpICogMTAwYCUKCmBgYHtyIEZTX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfSU5ERUwkdHlwZSA8LSAicmF3IgpGU19JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCkZTX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCkZTX0lOREVMX2FsbCA8LSByYmluZChGU19JTkRFTCwgRlNfSU5ERUxfbGVuaWVudCwgRlNfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KEZTX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIkZpc2hlclRlc3QgU3RyYW5kIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoNjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdAoKYGBge3IgUlNUX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClJTVF9TTlBfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoUlNUX1NOUCwgVjUgPiAtOCAmIFY1IDwgOCkKUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFJTVF9TTlAsIFY1ID4gLTQgJiBWNSA8IDQpCmBgYAogIApgYGB7ciBSU1RfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpSU1RfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoUlNUX0lOREVMLCBWNSA+IC04ICYgVjUgPCA4KQpSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkIDwtIHN1YnNldChSU1RfSU5ERUwsIFY1ID4gLTQgJiBWNSA8IDQpCmBgYAoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBSU1QgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KFJTVF9TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9TTlApIC0gbnJvdyhSU1RfU05QX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhSU1RfU05QKSAqIDEwMGAlCgpgYGB7ciBSU1RfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KUlNUX1NOUCR0eXBlIDwtICJyYXciClJTVF9TTlBfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpSU1RfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClJTVF9TTlBfYWxsIDwtIHJiaW5kKFJTVF9TTlAsIFJTVF9TTlBfbGVuaWVudCwgUlNUX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoUlNUX1NOUF9hbGwsIGFlcyhWNSwgZmlsbD10eXBlLCBjb2xvdXI9dHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUmVhZCBQb3NpdGlvbiBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTgsOCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTQsNCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgUlNUIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coUlNUX0lOREVMKSAtIG5yb3coUlNUX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KFJTVF9JTkRFTCkgKiAxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coUlNUX0lOREVMKSAqIDEwMGAlCgpgYGB7ciBSU1RfSU5ERUxfYWxsLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpSU1RfSU5ERUwkdHlwZSA8LSAicmF3IgpSU1RfSU5ERUxfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpSU1RfSU5ERUxfc3RyaW5nZW50JHR5cGUgPC0gInN0cmluZ2VudCIKUlNUX0lOREVMX2FsbCA8LSByYmluZChSU1RfSU5ERUwsIFJTVF9JTkRFTF9sZW5pZW50LCBSU1RfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KFJTVF9JTkRFTF9hbGwsIGFlcyhWNSwgZmlsbD10eXBlLCBjb2xvdXI9dHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAgCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC04LDgpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC00LDQpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKCg==